package com.practice.shua1;

/**
 * 【leetcode 125 lintcode 415】
 * 【描述】
 * 这个题目说的是，给你一个字符串，你要判断它是否是回文字符串。字符串里只考虑字母和数字，其它的字符可以无视。另外，对于字母，可以忽略大小写。
 * 【举例】
 * 比如说，给你的字符串是：
 * " race a E-car "
 * 只考虑字母数字并且忽略大小写，它是一个回文字符串，因此返回 true。再比如说，给你的字符串是
 * " race a car "
 * 对比到最后，中间的 e 和 a 不相等，因此不是一个回文字符串，返回 false。
 *
 * @author lineng
 * @create 2021-05-01 10:00
 */
public class Code_01_IsPalinDrome {

    // 思路一：头尾指针比较，
    // 头指针从头往尾移动，尾指针从尾往头一定，
    // startIndex<=endIndex
    // 分清楚什么情况下移动头指针，什么时候一定尾指针，说明时候头尾一起移动
    public static boolean isPalindrome(String s) {
        if (s == null || s.length() == 0) {
            return true;
        }
        char[] chars = s.toCharArray();
        int startIndex = 0;
        int endIndex = chars.length - 1;
        while (startIndex <= endIndex) {
            if (
                    (chars[startIndex] < '0')||
                    ('9' < chars[startIndex] && chars[startIndex]<'A') ||
                    (chars[startIndex]>'Z'&& chars[startIndex]<'a') || (chars[startIndex] > 'z')
            ){
                // chars[startIndex]非字母或数字
                startIndex++;
                continue;
            }
            if (
                    (chars[endIndex] < '0')||
                            ('9' < chars[endIndex] && chars[endIndex]<'A') ||
                            (chars[endIndex]>'Z'&& chars[endIndex]<'a') || (chars[endIndex] > 'z')
            ){
                // chars[endIndex]非字母或数字
                endIndex--;
                continue;
            }

            if (chars[startIndex] != chars[endIndex]){
                if (('0'<=chars[startIndex]&&chars[startIndex]<='9') || ('0'<=chars[endIndex]&&chars[endIndex]<='9')){
                    // 不相等并且其中一个是数字，直接返回false
                    return false;
                }else if (Math.abs(chars[startIndex]-chars[endIndex])!=32){
                    // 不相等并且都不是数字，看看ASCII码是否相差32
                    // 大小写字母间相差32
                    return false;
                }
            }
            startIndex++;
            endIndex--;
        }
        return true;
    }

    public static void main(String[] args) {
        System.out.println(isPalindrome("A man, a plan, a canal: Panama"));
    }

}
